#include "CobroMensualModule.h"

extern QSqlDatabase enjoylifedb;
// CObro Mensual
extern CobroMensualSqlTableModel *cobro_mensual_model;
extern QTableView *cobro_mensual_view;
// Cliente
ClienteCMSqlTableModel *client_cm_model;
QTableView *client_cm_view;
// Vista de cobros mensual
CobroMensualSqlTableModel *vistaCobroMensual_modelo;
QTableView *vistaCobroMensual_vista;

bool exitoCupon;

CobroMensualModule::CobroMensualModule(QWidget *parent) :
    QMainWindow(parent)
{
    cobro_mes_toolbar = new CustomModulesToolbar(this);
    genTodosLosCuponesToolBar();
    configCuponMensualToolBar();
    ActualizarListasToolbar();
    ListadoCobroMensualToolBar();
    addToolBar(cobro_mes_toolbar);

    cobro_mensual_model = new CobroMensualSqlTableModel(this,enjoylifedb);
    cobro_mensual_model->setTable("cobro_mensual");
    cobro_mensual_model->setEditStrategy(CobroMensualSqlTableModel::OnFieldChange);

    client_cm_model = new ClienteCMSqlTableModel(this,enjoylifedb);
    client_cm_model->setTable("cliente");
    client_cm_model->setEditStrategy(ClienteCMSqlTableModel::OnFieldChange);

    // Vista de cobros mensual
    vistaCobroMensual_modelo = new CobroMensualSqlTableModel(this,enjoylifedb);

    QWidget* widget_main = new QWidget();
    QWidget* widgetModels = new QWidget;
    QWidget* widget_derecho = new QWidget();

    QVBoxLayout *layout = new QVBoxLayout;
    QSplitter *split = new QSplitter;

    QGridLayout *grid_central = new QGridLayout();
    QGridLayout *grid_derecho = new QGridLayout();

    QGroupBox *group_filtro= new QGroupBox("Filtros y Busqueda",this);

    QFormLayout *form_filtros = new QFormLayout;

    VerticalScrollArea *scrollArea = new VerticalScrollArea();

    client_cm_view = new QTableView(split);
    client_cm_view->setModel(client_cm_model);

    vistaCobroMensual_vista = new QTableView(split);
    vistaCobroMensual_vista->setModel(vistaCobroMensual_modelo);

//    cobro_mensual_view = new QTableView(split);
//    cobro_mensual_view->setModel(cobro_mensual_model);

    split->setOrientation(Qt::Horizontal);
    split->adjustSize();
    // Set the initial sizes for QSplitter widgets
    QList<int> sizes;
    sizes << 200 << 750;
    split->setSizes(sizes);

    layout->addWidget(split);
    widgetModels->setLayout(layout);

    // Filtros
    QLabel *filter_label = new QLabel("Busqueda Rápida",0);
    filter_label->setFixedWidth(180);
    filter_label->setFixedHeight(20);
    filter_label->setAlignment(Qt::AlignCenter);
    filter_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(filter_label);

    filter_cliente = new QRadioButton("Cliente",0);
    connect(filter_cliente,SIGNAL(clicked()),this,SLOT(EncontrarPersona()));
    form_filtros->addRow(filter_cliente);

    filter_concepto = new QRadioButton("Concepto",0);
    connect(filter_concepto,SIGNAL(clicked()),this,SLOT(EncontrarConcepto()));
    form_filtros->addRow(filter_concepto);

    find_line = new QLineEdit(this);
    find_line->setFixedSize(180,20);
    find_line->setEnabled(false);
    form_filtros->addRow(find_line);

    QLabel *separador_label = new QLabel("",0);
    separador_label->setFixedSize(180,5);
    separador_label->setAlignment(Qt::AlignCenter);
    separador_label->setStyleSheet("background-color: rgb(255,255,255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(separador_label);

    QLabel *fecha_label = new QLabel("Fecha",0);
    fecha_label->setFixedSize(180,20);
    fecha_label->setAlignment(Qt::AlignCenter);
    fecha_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(fecha_label);

    fecha_cm = new QDateEdit(this);
    fecha_cm->setFixedSize(180,30);
    fecha_cm->setEnabled(true);
    fecha_cm->setStyleSheet("background-color: rgb(200, 200, 200);color: rgb(0, 0, 0);font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    QDate *date;
    fecha_cm->setDate(date->currentDate());
    connect(fecha_cm,SIGNAL(dateChanged(QDate)),this,SLOT(FiltrarCMFecha()));
    form_filtros->addRow(fecha_cm);

    QLabel *separador_label2 = new QLabel("",0);
    separador_label2->setFixedSize(180,5);
    separador_label2->setAlignment(Qt::AlignCenter);
    separador_label2->setStyleSheet("background-color: rgb(255,255,255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(separador_label2);

    QLabel *label_deuda = new QLabel("Total a cobrar $",0);
    label_deuda->setFixedSize(180,20);
    label_deuda->setAlignment(Qt::AlignCenter);
    label_deuda->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(label_deuda);

    deuda_edit = new QLineEdit(this);
    deuda_edit->setFixedSize(180,40);
    deuda_edit->setEnabled(false);
    deuda_edit->setAlignment(Qt::AlignCenter);
    deuda_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 30pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(deuda_edit);

    QLabel *label_deuda_recargo = new QLabel("Total a cobrar con recargo $",0);
    label_deuda_recargo->setFixedSize(180,20);
    label_deuda_recargo->setAlignment(Qt::AlignCenter);
    label_deuda_recargo->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(label_deuda_recargo);

    deuda_recargo_edit = new QLineEdit(this);
    deuda_recargo_edit->setFixedSize(180,40);
    deuda_recargo_edit->setEnabled(false);
    deuda_recargo_edit->setAlignment(Qt::AlignCenter);
    deuda_recargo_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 30pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(deuda_recargo_edit);

    QPixmap SITIimage("://Images/SITI-Soft_Logo.png");
    QLabel *SITILabel = new QLabel("",0);
    SITILabel->setPixmap(SITIimage);
    SITILabel->setFixedHeight(200);
    SITILabel->setScaledContents(true);
    SITILabel->setAlignment(Qt::AlignVCenter);
    SITILabel->setAlignment(Qt::AlignHCenter);

    // ==========================================
    group_filtro->setLayout(form_filtros);
    group_filtro->setFixedWidth(250);

    scrollArea->setWidgetResizable(true);
    scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    scrollArea->setWidget(group_filtro);

    grid_derecho->addWidget(scrollArea,0,0);
    grid_derecho->addWidget(SITILabel,1,0);

    widget_derecho->setLayout(grid_derecho);
    widget_derecho->setFixedWidth(210);

    grid_central->addWidget(widgetModels,0,0);
    grid_central->addWidget(widget_derecho,0,1);

    widget_main->setLayout(grid_central);
    setCentralWidget(widget_main);
    // ==========================================

    UpdateClientList();
    LimpiarListaCM();
    ControlVencimientos();

    //    connect(cobro_mensual_view,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(openCobroMensualClient()));
    connect(client_cm_view,SIGNAL(clicked(QModelIndex)),this,SLOT(SeleccionarCobro(QModelIndex)));
    // Doble click en cliente y muestra la info.
    connect(client_cm_view, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(AbrirInfoCliente()));

    // Definición de acceso directo para imprimir todos los cupones mediante la combinacion de teclas "Ctrl + T".
    QShortcut* shortcutCTodos = new QShortcut(QKeySequence("Ctrl+T"), this);
    connect(shortcutCTodos, SIGNAL(activated()), this, SLOT(ConfigurarCuponesClientes()));
    // Definición de acceso directo para imprimir un solo cupon mediante la combinacion de teclas "Ctrl + R".
    QShortcut* shortcutCIndividual = new QShortcut(QKeySequence("Ctrl+C"), client_cm_view);
    connect(shortcutCIndividual, SIGNAL(activated()), this, SLOT(openCobroMensualClient()));
    // Definición de acceso directo para actualizar las listas mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(UpdateListsBtn()));
    // Definición de acceso directo para imprimir reporte mediante la combinacion de teclas "Ctrl + R".
    QShortcut* shortcutReporte = new QShortcut(QKeySequence("Ctrl+R"), this);
    connect(shortcutReporte, SIGNAL(activated()), this, SLOT(openListadoCM()));
}

void CobroMensualModule::openCobroMensualClient()
{
    exitoCupon = false;
    int selection = -1;
    if (!(client_cm_view->currentIndex().row() == -1))
        selection = client_cm_view->currentIndex().row();

    if (selection != -1) {
        QString dir_cupones = QFileDialog::getExistingDirectory(this, "Seleccione un directorio de salida", QCoreApplication::applicationDirPath(),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

        if (! dir_cupones.isEmpty())
            GenerarCuponClientePDF(dir_cupones,client_cm_model->index(selection,1).data().toString());

        if (exitoCupon) {
            QString msg = "El cupón se generó exitosamente en \"";
            msg.append(dir_cupones).append("\"");
            QMessageBox::information(this,"Información",msg);
        }
    }
    else {
        QString msg = "Para realizar esta operación seleccione un cliente primero";
        QMessageBox::information(this,"Información",msg);
    }
}

void CobroMensualModule::ConfigurarCuponesClientes()
{
    QString carpeta_mc = "Cupones_Pago_";
    if (QDate::currentDate().day() >= 25) {
        if (QDate::currentDate().month() < 12) {
            carpeta_mc.append(QString::number(QDate::currentDate().month()+1));
            carpeta_mc.append("_").append(QString::number(QDate::currentDate().year()));
        }
        else {
            carpeta_mc.append(QString::number(1));
            carpeta_mc.append("_").append(QString::number(QDate::currentDate().year()+1));
        }
    }
    else {
        carpeta_mc.append(QString::number(QDate::currentDate().month()));
        carpeta_mc.append("_").append(QString::number(QDate::currentDate().year()));
    }

    QString dir_cupones = QFileDialog::getExistingDirectory(this, "Seleccione un directorio de salida", QCoreApplication::applicationDirPath(),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

    if (! dir_cupones.isEmpty()) {
        dir_cupones.append("/").append(carpeta_mc);

        QDir dir(dir_cupones);

        if (dir.exists()) {
            QMessageBox::StandardButton reply;
            reply = QMessageBox::question(this, "Advertencia", "El directorio elegido ya ha sido elegido anteriormente. Quiere sobreescribirlo?",
                                          QMessageBox::Yes|QMessageBox::No);

            if (reply == QMessageBox::Yes) {

                if (! removeDirRecursive(dir_cupones)) {
                    QMessageBox::critical(this,"Error crítico","No se puede borrar el directorio. Intente nuevamente");
                    return;
                }

                if (! dir.mkdir(dir_cupones)) {
                    QMessageBox::critical(this,"Error crítico","No se puede crear el directorio donde se almacenan los cupones. Intente nuevamente");
                    return;
                }
            }
            else {
                QMessageBox::information(this,"AVISO!","Por favor seleccione un directorio distinto para guardar los cupones.",
                                         QMessageBox::Ok);
                return;
            }
        }
        else {
            if (! dir.mkdir(dir_cupones)) {
                QMessageBox::critical(this,"Error crítico","No se puede crear el directorio donde se almacenan los cupones. Intente nuevamente");
                return;
            }
        }

        GenerarCuponesCliente(dir_cupones);

        QString msg = "Los cupones se generaron exitosamente en \"";
        msg.append(dir_cupones).append("\"");
        QMessageBox::information(this,"Información",msg);
    }
}

void CobroMensualModule::openListadoCM()
{
    QString dir_listado = QFileDialog::getExistingDirectory(this, "Seleccione un directorio de salida", QCoreApplication::applicationDirPath(),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

    if (! dir_listado.isEmpty())
        GenerarListadoPDF(dir_listado);
}

void CobroMensualModule::UpdateListsBtn()
{
    cliente = " ";
    QDate date;
    fecha_cm->setDate(date.currentDate());
    UpdateClientList();
    LimpiarListaCM();
    ActualizarValoresCobroMensual();
}

void CobroMensualModule::EncontrarPersona()
{
    if (filter_cliente->isChecked()) {
        LimpiarListaCM();
        filter_concepto->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
    }
    else {
        UpdateClientList();
        LimpiarListaCM();
        find_line->setEnabled(false);
    }
}

void CobroMensualModule::FiltroPersona()
{
    LimpiarListaCM();
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCM = "razon_social ilike '%" + find_line->text() + "%' and estado is null";
        client_cm_model->setTable("cliente");
        client_cm_model->filter().clear();
        client_cm_model->setFilter(filtroCM);
        if (!(client_cm_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientList();
            LimpiarListaCM();
            return;
        }
        else {
            enjoylifedb.commit();
            RefreshClientCMView();
            LimpiarListaCM();
        }
    }
    else {
        UpdateClientList();
        LimpiarListaCM();
    }
}

void CobroMensualModule::EncontrarConcepto()
{
    if (filter_concepto->isChecked()) {
        LimpiarListaCM();
        filter_cliente->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroConcepto()));
    }
    else {
        UpdateClientList();
        LimpiarListaCM();
        find_line->setEnabled(false);
    }
}

void CobroMensualModule::FiltroConcepto()
{
    LimpiarListaCM();
    if (!find_line->text().isEmpty()) {
        QDate date;
        date.setDate(date.currentDate().year(),date.currentDate().month(),01);
        QString formatDate = "yyyy-MM-dd";
        QString date2 = date.toString(formatDate);

        filtroCM = "(estado_deuda = 'Debe' or estado_deuda = 'No informado') and ";
        filtroCM.append("desde <= '");
        filtroCM.append(date2).append("' and cc_razon_social = '");
        filtroCM.append(cliente).append("'");
        filtroCM.append(" and concepto ilike '%").append(find_line->text()).append("%'");

        enjoylifedb.transaction();
        cobro_mensual_model->setTable("cobro_mensual");
        cobro_mensual_model->filter().clear();
        cobro_mensual_model->setFilter(filtroCM);
        if (!(cobro_mensual_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientList();
            LimpiarListaCM();
            return;
        }
        else {
            enjoylifedb.commit();
            RefreshCobroMesView();
        }
    }
    else {
        UpdateClientList();
        LimpiarListaCM();
    }
}

void CobroMensualModule::FiltrarCMFecha()
{
    QDate date;
    date.setDate(fecha_cm->date().year(),fecha_cm->date().month(),01);

    QString formatDate = "yyyy-MM-dd";
    QString dates = date.toString(formatDate);

    if (cliente == " ") {
        filtroCM = "(estado_deuda = 'Debe' or estado_deuda = 'No informado') and";
        filtroCM.append(" desde <= '").append(dates).append("'");
    } else {
        filtroCM = "cc_razon_social = '";
        filtroCM.append(cliente).append("'");
        filtroCM.append(" and (estado_deuda = 'Debe' or estado_deuda = 'No informado') and");
        filtroCM.append(" desde <= '").append(dates).append("'");
    }

    enjoylifedb.transaction();
    cobro_mensual_model->setTable("cobro_mensual");
    cobro_mensual_model->filter().clear();
    cobro_mensual_model->setFilter(filtroCM);
    if (!(cobro_mensual_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    UpdateClientList();
    RefreshCobroMesView();
    ActualizarValoresCobroMensual();
}

void CobroMensualModule::AbrirInfoCliente()
{
    int selection = -1;
    if (!(client_cm_view->currentIndex().row() == -1)) {
        selection = client_cm_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        EditClient *edit_client_form = new EditClient();
        edit_client_form->GetClientInfo(selection);
        edit_client_form->show();

        enjoylifedb.commit();
    } else {
        QMessageBox::warning(this, tr("Modificar Cliente"),
                             tr("La operación no se puede concretar."
                                "\nNingún cliente ha sido seleccionado."));
    }
}

void CobroMensualModule::SeleccionarCobro(QModelIndex ind)
{
    if (ind.row() != -1) {
        cliente = client_cm_model->index(ind.row(),1).data().toString();
        QDate date;
        date.setDate(date.currentDate().year(),date.currentDate().month(),01);
        QString formatDate = "yyyy-MM-dd";
        QString dates = date.toString(formatDate);

//        QString filtro_cobro = "cc_razon_social = '";
//        filtro_cobro.append(cliente).append("'");
//        filtro_cobro.append(" and (estado_deuda = 'Debe' or estado_deuda = 'No informado') and");
//        filtro_cobro.append(" desde <= '").append(dates).append("'");

        QSqlQuery *queryVistaCM = new QSqlQuery(enjoylifedb);
        QString strVistaCM;
        strVistaCM.append("CREATE OR REPLACE VIEW vista_cobroMensual AS "
                          "SELECT cc.cc_razon_social, cc.concepto, cc.debe, cc.desde, cc.estado_deuda, cc.tipo_cobro, cc.descripcion, "
                          "CASE WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) > 20) THEN (cc.debe * 0.2) "
                          "     WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) > 10) THEN (cc.debe * 0.1) "
                          "     WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) <= 10) THEN (cc.debe * 0) "
                          "     ELSE NULL "
                          "END AS \"Recargo\" "
                          "FROM cuenta_corriente cc "
                          "WHERE cc.cc_razon_social = '").append(cliente);
        strVistaCM.append("' and (cc.estado_deuda = 'Debe' or cc.estado_deuda = 'No informado') and cc.desde <= '");
        strVistaCM.append(dates).append("'");
        strVistaCM.append(" order by cc.cc_razon_social, desde;");

        enjoylifedb.transaction();
        if (! queryVistaCM->exec(strVistaCM)) {
            QMessageBox::critical(this,"Error","Error al crear la vista de Cobro Mensual, intente nuevamente");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.transaction();
        vistaCobroMensual_modelo->setTable("vista_cobroMensual");
        if (! vistaCobroMensual_modelo->select()) {
            QMessageBox::critical(this,"Error!", "No se pudo recuperar los resgitros para el cliente seleccionado.");
            enjoylifedb.rollback();
            UpdateListsBtn();
            return;
        }
        enjoylifedb.commit();
        enjoylifedb.commit();
        RefreshCobroMesView();

        fecha_cm->setDate(date.currentDate());

        //Actualiza monto de cobro total para el cliente seleccionado
        QSqlQuery *queryMonto = new QSqlQuery(enjoylifedb);
        QString strMonto;
        strMonto.append("select sum(debe) from vista_cobroMensual");/*.append(filtro_cobro)*/;

        if (! queryMonto->exec(strMonto)) {
            QMessageBox::critical(this,"Error en la consulta",queryMonto->lastError().text());
            return;
        }

        double suma_debe = -1;
        while (queryMonto->next())
            suma_debe = queryMonto->value(0).toDouble();

        const int precision = 2;
        deuda_edit->clear();
        deuda_edit->setText(QString("%1").arg(suma_debe, 0, 'f', precision));

        //Actualiza monto de cobro total con recargo para el cliente seleccionado
        QSqlQuery *queryMontoRecargo = new QSqlQuery(enjoylifedb);
        QString strMontoRecargo;
        strMontoRecargo.append("SELECT sum("
                          "CASE WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(desde)))) > 20) THEN (debe * 0.2) "
                          "     WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(desde)))) > 10) THEN (debe * 0.1) "
                          "     WHEN ((EXTRACT(DAYS FROM (timestamp 'now()' - date(desde)))) <= 10) THEN (debe * 0) "
                          "     ELSE NULL "
                          "END) FROM vista_cobroMensual");

        if (! queryMontoRecargo->exec(strMontoRecargo)) {
            QMessageBox::critical(this,"Error en la consulta",queryMontoRecargo->lastError().text());
            return;
        }

        double suma_debe_recargo = -1;
        while (queryMontoRecargo->next())
            suma_debe_recargo = queryMontoRecargo->value(0).toDouble();

        suma_debe_recargo = suma_debe_recargo + suma_debe;

        const int precision_recargo = 2;
        deuda_recargo_edit->clear();
        deuda_recargo_edit->setText(QString("%1").arg(suma_debe_recargo, 0, 'f', precision_recargo));
    }
}

void CobroMensualModule::RefreshModelView()
{
    int selection = -1;
    if (!(client_cm_view->currentIndex().row() == -1))
        selection = client_cm_view->currentIndex().row();

    if (selection != -1) {

        QDate date;
        date.setDate(date.currentDate().year(),date.currentDate().month(),01);
        QString formatMonth = "yyyy-MM-dd";
        QString month = date.toString(formatMonth);

        QString filtro_gasto = "(estado_deuda = 'Debe' or estado_deuda = 'No informado') and ";
        filtro_gasto.append("desde <= '");
        filtro_gasto.append(month).append("' and cc_razon_social = '");
        filtro_gasto.append(cobro_mensual_model->index(selection,1).data().toString()).append("'");

        cobro_mensual_model->setTable("cobro_mensual");
        cobro_mensual_model->filter().clear();
        cobro_mensual_model->setFilter(filtro_gasto);

        enjoylifedb.transaction();
        if (! cobro_mensual_model->select()) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
            enjoylifedb.rollback();
            return;
        }
        enjoylifedb.commit();

    }

    RefreshCobroMesView();
}

void CobroMensualModule::RefreshCobroMesView()
{
    vistaCobroMensual_modelo->setHeaderData(1, Qt::Horizontal, "Concepto");
    vistaCobroMensual_modelo->setHeaderData(2, Qt::Horizontal, "Deuda");
    vistaCobroMensual_modelo->setHeaderData(3, Qt::Horizontal, "Deuda Desde");
//    vistaCobroMensual_modelo->setHeaderData(4, Qt::Horizontal, "Estado");
    vistaCobroMensual_modelo->setHeaderData(5, Qt::Horizontal, "Tipo de Cobro");
    vistaCobroMensual_modelo->setHeaderData(6, Qt::Horizontal, "Descripción");
    vistaCobroMensual_modelo->setHeaderData(7, Qt::Horizontal, "Recargo");

    vistaCobroMensual_vista->setModel(vistaCobroMensual_modelo);
    vistaCobroMensual_vista->setSortingEnabled(true);
    vistaCobroMensual_vista->setAlternatingRowColors(true);
    vistaCobroMensual_vista->setGridStyle(Qt::SolidLine);
    vistaCobroMensual_vista->setEditTriggers(QAbstractItemView::NoEditTriggers);
    vistaCobroMensual_vista->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    vistaCobroMensual_vista->sortByColumn(3, Qt::SortOrder());

    vistaCobroMensual_vista->hideColumn(0);
    vistaCobroMensual_vista->hideColumn(4);
}

void CobroMensualModule::UpdateClientList()
{
    enjoylifedb.transaction();
    QString filtro = "estado is null";
    client_cm_model->setTable("cliente");
    client_cm_model->setFilter(filtro);
    if (!(client_cm_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();

    RefreshClientCMView();
}

void CobroMensualModule::RefreshClientCMView()
{
    client_cm_model->setHeaderData(1,Qt::Horizontal,"Cliente");

    client_cm_view->setModel(client_cm_model);
    client_cm_view->hideColumn(0);
    int i = 2;
    while (i < 22) {
        client_cm_view->hideColumn(i);
        i++;
    }

    client_cm_view->setCornerButtonEnabled(true);
    client_cm_view->setAlternatingRowColors(true);
    client_cm_view->setGridStyle(Qt::SolidLine);
    client_cm_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    client_cm_view->setWordWrap(true);
    client_cm_view->horizontalHeader()->setStretchLastSection(true);
    client_cm_view->sortByColumn(1,Qt::SortOrder());
}

void CobroMensualModule::LimpiarListaCM()
{
    //    QString filtro = "cc_razon_social = ' '";

    //    cobro_mensual_model->setTable("cobro_mensual");
    //    cobro_mensual_model->setFilter(filtro);

    //    enjoylifedb.transaction();
    //    if (! cobro_mensual_model->select()) {
    //        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
    //        enjoylifedb.rollback();
    //        return;
    //    }
    //    enjoylifedb.commit();

    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString str;
    str.append("CREATE OR REPLACE VIEW vista_cobroMensual AS "
               "SELECT cc.cc_razon_social, cc.concepto, cc.debe, cc.desde, cc.estado_deuda, cc.tipo_cobro, cc.descripcion, "
               "CASE WHEN (EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) > 20 THEN (cc.debe * 0.2) "
               "     WHEN (EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) > 10 THEN (cc.debe * 0.1) "
               "     WHEN (EXTRACT(DAYS FROM (timestamp 'now()' - date(cc.desde)))) <= 10 THEN (cc.debe * 0) "
               "     ELSE NULL "
               "END AS \"Recargo\" "
               "FROM cuenta_corriente cc "
               "WHERE cc.cc_razon_social = '' AND (cc.estado_deuda = 'Debe' or cc.estado_deuda = 'No informado') "
               "ORDER BY cc.cc_razon_social, desde ");
    enjoylifedb.transaction();
    if (! query->exec(str)) {
        QMessageBox::critical(this,"Error","Error al crear la vista de Cobro Mensual, intente nuevamente");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.transaction();
    vistaCobroMensual_modelo->setTable("vista_cobroMensual");
    if (! vistaCobroMensual_modelo->select()) {
        QMessageBox::critical(this,"Error!", "No se pudo recuperar los resgitros para el cliente seleccionado.");
        enjoylifedb.rollback();
        UpdateListsBtn();
        return;
    }
    enjoylifedb.commit();
    enjoylifedb.commit();
    RefreshCobroMesView();
}

void CobroMensualModule::ControlVencimientos()
{
    int cantRows = 0;
    QDate date2;
    QString formatoMes = "MM";
    QString mes = date2.currentDate().toString(formatoMes);
    QString formatoAnio = "yyyy";
    QString anio = date2.currentDate().toString(formatoAnio);
    QString filtro;
    filtro = "date_part('month', desde) <= '";
    filtro.append(mes).append("'");
    filtro.append(" and date_part('year', desde) <= '");
    filtro.append(anio).append("'");
    filtro.append(" and estado_deuda = 'No informado'");

    cobro_mensual_model->setTable("cobro_mensual");
    cobro_mensual_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!cobro_mensual_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de los Cobros mensuales.");
        enjoylifedb.rollback();
        UpdateListsBtn();
        return;
    }
    cantRows = cobro_mensual_model->rowCount();
    if (cantRows > 0) {
        for (int i = 0; i < cantRows; ++i) {
            QSqlRecord recordCM = cobro_mensual_model->record(i);
            recordCM.setValue("estado_deuda","Debe");
            cobro_mensual_model->setRecord(i, recordCM);
            enjoylifedb.transaction();
            if (!cobro_mensual_model->submitAll()) {
                QString error = cobro_mensual_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de un Cobro Mensual. Por favor controle los Cobros mensuales."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                UpdateListsBtn();
                return;
            }
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
    }
    UpdateListsBtn();
}

void CobroMensualModule::ActualizarValoresCobroMensual()
{
    QDate date;
    date.setDate(fecha_cm->date().year(),fecha_cm->date().month(),01);

    QString formatDate = "yyyy-MM-dd";
    QString dates = date.toString(formatDate);
    QString filtro_cobro;

    if (cliente == " ") {
        filtro_cobro = "(estado_deuda = 'Debe' or estado_deuda = 'No informado') and";
        filtro_cobro.append(" desde <= '").append(dates).append("'");
    } else {
        filtro_cobro = "cc_razon_social = '";
        filtro_cobro.append(cliente).append("'");
        filtro_cobro.append(" and (estado_deuda = 'Debe' or estado_deuda = 'No informado') and");
        filtro_cobro.append(" desde <= '").append(dates).append("'");
    }

    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString str;
    str.append("select sum(debe) from vista_cobroMensual where ").append(filtro_cobro);

    if (! query->exec(str)) {
        QMessageBox::critical(this,"Error en la consulta",query->lastError().text());
        return;
    }

    double suma_debe = -1;
    while (query->next())
        suma_debe = query->value(0).toDouble();

    const int precision = 2;
    deuda_edit->clear();
    deuda_edit->setText(QString("%1").arg(suma_debe, 0, 'f', precision));
}

// Cupones
void CobroMensualModule::configCuponMensualToolBar()
{
    action_cupon_mensual = new QAction("Configurar Cupón de Pago",this);
    action_cupon_mensual->setIcon(QIcon("://Icons/BarraHerramientas/cuponPago48.png"));
    action_cupon_mensual->setToolTip("Permite generar el cupón de pago para el cliente seleccionado");
    connect(action_cupon_mensual,SIGNAL(triggered()),this,SLOT(openCobroMensualClient()));

    cobro_mes_toolbar->addAction(action_cupon_mensual);
}

void CobroMensualModule::genTodosLosCuponesToolBar()
{
    action_todos_cupones = new QAction("Generar los cupones de cobro",this);
    action_todos_cupones->setIcon(QIcon("://Icons/BarraHerramientas/todosCupones48.png"));
    action_todos_cupones->setIconText("Generar todos los cupones");
    action_todos_cupones->setToolTip("Permite generar todos los cupones de pago");
    connect(action_todos_cupones,SIGNAL(triggered()),this,SLOT(ConfigurarCuponesClientes()));

    cobro_mes_toolbar->addAction(action_todos_cupones);
}

void CobroMensualModule::ActualizarListasToolbar()
{
    action_update_cm = new QAction("Actualizar Listados",this);
    action_update_cm->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    action_update_cm->setToolTip("Actualiza las listas de clientes y de cobros mensuales");
    connect(action_update_cm,SIGNAL(triggered()),this,SLOT(UpdateListsBtn()));

    cobro_mes_toolbar->addSeparator();
    cobro_mes_toolbar->addAction(action_update_cm);
}

void CobroMensualModule::ListadoCobroMensualToolBar()
{
    action_listado_cm = new QAction("Listado de Cobros Mensuales",this);
    action_listado_cm->setIcon(QIcon("://Icons/BarraHerramientas/listadoCobroMensual48.png"));
    action_listado_cm->setToolTip("Imprimir el listado de cobros mensuales");
    connect(action_listado_cm,SIGNAL(triggered()),this,SLOT(openListadoCM()));

    cobro_mes_toolbar->addAction(action_listado_cm);

}

bool CobroMensualModule::removeDirRecursive(QString path_to_dir)
{
    bool result = true;
    QDir dir(path_to_dir);

    if (dir.exists(path_to_dir)) {
        Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden  | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
            if (info.isDir()) {
                result = removeDirRecursive(info.absoluteFilePath());
            }
            else {
                result = QFile::remove(info.absoluteFilePath());
            }

            if (!result) {
                return result;
            }
        }
        result = dir.rmdir(path_to_dir);
    }

    return result;
}

void CobroMensualModule::GenerarCuponesCliente(QString path)
{
    QSqlQuery *queryVistaCM = new QSqlQuery(enjoylifedb);
    QString strVistaCm;
    strVistaCm.append("CREATE OR REPLACE VIEW vista_cobromensual_cupones AS "
                      "SELECT cc.cc_razon_social, "
                         "cc.concepto, "
                         "cc.debe, "
                         "cc.desde, "
                         "cc.estado_deuda, "
                         "cc.tipo_cobro, "
                         "cc.descripcion, "
                         "c.razon_social, "
                         "c.estado "
                      "FROM cuenta_corriente cc, cliente c "
                      "WHERE cc.cc_razon_social <> '' AND (cc.estado_deuda = 'Debe' OR cc.estado_deuda = 'No informado') "
                      "AND (cc.cc_razon_social = c.razon_social) AND (c.estado is null OR estado != 'BAJA') "
                      "ORDER BY cc.cc_razon_social, cc.desde");

    enjoylifedb.transaction();
    if (! queryVistaCM->exec(strVistaCm)) {
        QMessageBox::critical(this,"Error","Error al crear la vista de Cobro Mensual, intente nuevamente");
        enjoylifedb.rollback();
        return;
    }
//    enjoylifedb.transaction();
//    vistaCobroMensual_modelo->setTable("vista_cobroMensual");
//    if (! vistaCobroMensual_modelo->select()) {
//        QMessageBox::critical(this,"Error!", "No se pudo recuperar los resgitros para el cliente seleccionado.");
//        enjoylifedb.rollback();
//        UpdateListsBtn();
//        return;
//    }
//    enjoylifedb.commit();
    enjoylifedb.commit();
    RefreshCobroMesView();

    QSqlQuery *sel_raz_soc = new QSqlQuery(enjoylifedb);
    QString str_rs = "select razon_social from cliente where estado is null or estado != 'BAJA'";

    if (! sel_raz_soc->exec(str_rs)) {
        QMessageBox::critical(this,"Advertencia","No se pueden obtener los registros. Intente nuevamente");
        return;
    }

    while (sel_raz_soc->next()) {
        QSqlQuery *query_clientes = new QSqlQuery(enjoylifedb);
        QString str_sel = "select cc_razon_social from cuenta_corriente where desde = '";

        if (QDate::currentDate().month() >= 1 && QDate::currentDate().month() < 25) {
            str_sel.append(QString::number(QDate::currentDate().year())).append("-");
            str_sel.append(QString::number(QDate::currentDate().month())).append("-");
            str_sel.append(QString::number(1)).append("'");
        } else {
            if (QDate::currentDate().month() == 12) {
                str_sel.append(QString::number(QDate::currentDate().year()+1)).append("-");
                str_sel.append(QString::number(1)).append("-");
                str_sel.append(QString::number(1)).append("'");
            } else {
                str_sel.append(QString::number(QDate::currentDate().year())).append("-");
                str_sel.append(QString::number(QDate::currentDate().month()+1)).append("-");
                str_sel.append(QString::number(1)).append("'");
            }
        }

        //        str_sel.append(QString::number(QDate::currentDate().year())).append("-");
        //        str_sel.append(QString::number(QDate::currentDate().month())).append("-");
        //        str_sel.append(QString::number(1)).append("'");
        QString raz = sel_raz_soc->value(0).toString();
        str_sel.append(" and cc_razon_social = '").append(raz);
        str_sel.append("'");

        if (! query_clientes->exec(str_sel)) {
            QMessageBox::critical(this,"Advertencia","No se pueden obtener los regisitros. Intente nuevamente");
            return;
        }

        if (query_clientes->isNull(0))
            GenerarCuponClientePDF(path,raz);
        else {
            if (query_clientes->next())
                GenerarCuponClientePDF(path,query_clientes->value(0).toString());
        }
    }
}

void CobroMensualModule::GenerarCuponClientePDF(QString path, QString raz_soc)
{
    bool proxAnio = false;
    QString report_name = "Cupon_Pago_";
    report_name.append(raz_soc);
    report_name.append("_");

    if (QDate::currentDate().day() >= 25) {
        if (QDate::currentDate().month() < 12) {
            switch (QDate::currentDate().month()+1) {
            case 1:
                report_name.append("Enero");
                break;
            case 2:
                report_name.append("Febrero");
                break;
            case 3:
                report_name.append("Marzo");
                break;
            case 4:
                report_name.append("Abril");
                break;
            case 5:
                report_name.append("Mayo");
                break;
            case 6:
                report_name.append("Junio");
                break;
            case 7:
                report_name.append("Julio");
                break;
            case 8:
                report_name.append("Agosto");
                break;
            case 9:
                report_name.append("Septiembre");
                break;
            case 10:
                report_name.append("Octubre");
                break;
            case 11:
                report_name.append("Noviembre");
                break;
            case 12:
                report_name.append("Diciembre");
                break;
            }
        }
        else {
            report_name.append("Enero");
            proxAnio = true;
        }
    }
    else {
        switch (QDate::currentDate().month()) {
        case 1:
            report_name.append("Enero");
            break;
        case 2:
            report_name.append("Febrero");
            break;
        case 3:
            report_name.append("Marzo");
            break;
        case 4:
            report_name.append("Abril");
            break;
        case 5:
            report_name.append("Mayo");
            break;
        case 6:
            report_name.append("Junio");
            break;
        case 7:
            report_name.append("Julio");
            break;
        case 8:
            report_name.append("Agosto");
            break;
        case 9:
            report_name.append("Septiembre");
            break;
        case 10:
            report_name.append("Octubre");
            break;
        case 11:
            report_name.append("Noviembre");
            break;
        case 12:
            report_name.append("Diciembre");
            break;
        }
    }

    if (proxAnio) {
        report_name.append("_").append(QString::number(QDate::currentDate().year()+1)).append(".pdf");
    } else {
        report_name.append("_").append(QString::number(QDate::currentDate().year())).append(".pdf");
    }

    QPrinter* print = new QPrinter(QPrinter::HighResolution);
    print->setOutputFormat(QPrinter::PdfFormat);
    print->setColorMode(QPrinter::Color);
    QString final_path;
    final_path.append(path).append("/").append(report_name);
    print->setOutputFileName(final_path);

    QFile file;
    file.setFileName(final_path);
    if (file.exists()) {
        QMessageBox::StandardButton reply;
        reply = QMessageBox::question(this, "Advertencia", "El directorio elegido ya contiene un cupón con el mismo nombre. Quiere sobreescribirlo?",
                                      QMessageBox::Yes|QMessageBox::No);

        if (reply == QMessageBox::No) {
            QMessageBox::information(this,"AVISO!","Por favor seleccione un directorio distinto para guardar el cupón actual.",
                                     QMessageBox::Ok);
            exitoCupon = false;
            return;
        }
    }

    QTextDocument *document = new QTextDocument;

    QTextCursor cursor(document);
    cursor.movePosition(QTextCursor::Start);

    QTextImageFormat picture1;
    picture1.setName("://Images/membrete recibo-15.png");
    picture1.setWidth(630);
    picture1.setHeight(120);
    cursor.insertImage(picture1,QTextFrameFormat::InFlow);

    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();

    QTextCharFormat header_format;
    QFont headerfont;
    headerfont.setFamily("Helvetica57");
    headerfont.setBold(true);
    header_format.setFont(headerfont);

    cursor.insertText("Fecha: ",header_format);

    QTextCharFormat text_format;
    QFont textfont;
    textfont.setFamily("Helvetica57-Condensed");
    QFont textBoldFont;
    textBoldFont.setFamily("Helvetica57-Condensed");
    textBoldFont.setBold(true);
    text_format.setFont(textfont);

    QString str_date = QString::number(QDate::currentDate().day()).append("/");
    str_date.append(QString::number(QDate::currentDate().month())).append("/");
    str_date.append(QString::number(QDate::currentDate().year()));
    cursor.insertText(str_date,text_format);

    cursor.insertBlock();
    cursor.insertBlock();

    cursor.insertText("Atención: ",header_format);
    cursor.insertText("Enjoy Life.",text_format);

    cursor.insertBlock();
    cursor.insertBlock();

    cursor.insertText("Cliente: ",header_format);
    cursor.insertText(raz_soc,text_format);

    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();

    QTextImageFormat picture2;
    picture2.setName("://Images/linea-16.png");
    picture2.setWidth(630);
    picture2.setHeight(10);
    cursor.insertImage(picture2,QTextFrameFormat::InFlow);

    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();

    QTextCharFormat text_italic_format;
    QFont textitfont;
    textitfont.setFamily("Helvetica57-Condensed");
    textitfont.setItalic(true);
    text_italic_format.setFont(textitfont);

    cursor.insertText("De nuestra mayor consideración:",text_italic_format);

    cursor.insertBlock();
    cursor.insertBlock();

    cursor.insertText("\t \tSe detalla el cupón de pago al día de la fecha para los servicios contratados.",text_italic_format);

    cursor.insertBlock();
    cursor.insertBlock();

    cursor.insertText("Resumen: ",header_format);

    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();

    QDate date;
    QSqlQuery *sel_deuda_vencida = new QSqlQuery(enjoylifedb);
    QString str_deuda;
    QSqlQuery *select_proximo = new QSqlQuery(enjoylifedb);
    QString str_prox;
    if (date.currentDate().day() < 25) {
        // Se seleccionan los meses anteriores que tienen deuda!
        QString fecha_deuda;
        fecha_deuda.append(QString::number(QDate::currentDate().year())).append("-");
        fecha_deuda.append(QString::number(QDate::currentDate().month())).append("-");
        fecha_deuda.append(QString::number(1));
        str_deuda = "select concepto, desde, debe, tipo_cobro, descripcion from vista_cobromensual_cupones where cc_razon_social = '";
        str_deuda.append(raz_soc).append("' and estado_deuda = 'Debe' and desde < '");
        str_deuda.append(fecha_deuda).append("' order by desde asc");
        if (! sel_deuda_vencida->exec(str_deuda)) {
            QMessageBox::critical(this,"Información 1","No se pueden obtener los datos de las deudas vencidas. Intente nuevamente");
            return;
        }

        // Se selecciona el monto que debe pagar el mes corriente
        QDate fecha_prox;
        fecha_prox.setDate(fecha_prox.currentDate().year(), fecha_prox.currentDate().month(), fecha_prox.currentDate().day());
        QString formatoMes2 = "MM";
        QString formatoAnio2 = "yyyy";
        QString mes2 = fecha_prox.toString(formatoMes2);
        QString anio2 = fecha_prox.toString(formatoAnio2);
        str_prox = "select concepto, desde, debe, estado_deuda, tipo_cobro, descripcion from cuenta_corriente where ";
        str_prox.append("date_part('year', desde) = '").append(anio2).append("'");
        str_prox.append(" and date_part('month', desde) = '").append(mes2).append("'");
        str_prox.append(" and cc_razon_social = '").append(raz_soc);
        str_prox.append("' and estado_deuda <> 'Bonificado'");
        if (! select_proximo->exec(str_prox)) {
            QMessageBox::critical(this,"Información 2","No se pueden obtener los datos. Intente nuevamente");
            return;
        }
    } else {
        // Se seleccionan los meses anteriores que tienen deuda!  A LA MAULA!
        QString fecha_deuda;
        fecha_deuda.append(QString::number(QDate::currentDate().year())).append("-");
        fecha_deuda.append(QString::number(QDate::currentDate().month())).append("-");
        fecha_deuda.append(QString::number(1));
        //        QSqlQuery *sel_deuda_vencida = new QSqlQuery(enjoylifedb);
        str_deuda = "select concepto, desde, debe, tipo_cobro, descripcion from vista_cobromensual_cupones where cc_razon_social = '";
        str_deuda.append(raz_soc).append("' and estado_deuda = 'Debe' and desde <= '");
        str_deuda.append(fecha_deuda).append("' order by desde asc");
        if (! sel_deuda_vencida->exec(str_deuda)) {
            QMessageBox::critical(this,"Información","No se pueden obtener los datos de las deudas vencidas. Intente nuevamente");
            return;
        }

        // Se selecciona el monto que debe pagar el mes proximo
        QDate fecha_prox;
        if (fecha_prox.currentDate().month() == 12) {
            fecha_prox.setDate(fecha_prox.currentDate().year() + 1, 1, 1);
        } else {
            fecha_prox.setDate(fecha_prox.currentDate().year(), fecha_prox.currentDate().month() + 1, 1);
        }
        QString formatoMes2 = "MM";
        QString formatoAnio2 = "yyyy";
        QString mes2 = fecha_prox.toString(formatoMes2);
        QString anio2 = fecha_prox.toString(formatoAnio2);
        //        QSqlQuery *select_proximo = new QSqlQuery(enjoylifedb);
        str_prox = "select concepto, desde, debe, estado_deuda, tipo_cobro, descripcion from cuenta_corriente where ";
        str_prox.append("date_part('year', desde) = '").append(anio2).append("'");
        str_prox.append(" and date_part('month', desde) = '").append(mes2).append("'");
        str_prox.append(" and cc_razon_social = '").append(raz_soc);
        str_prox.append("' and estado_deuda <> 'Bonificado'");
        if (! select_proximo->exec(str_prox)) {
            QMessageBox::critical(this,"Información","No se pueden obtener los datos. Intente nuevamente");
            return;
        }
    }

    int total_row = 0;
    bool tiene_deudas = false;

    if (sel_deuda_vencida->size() > 0) {
        total_row = total_row + sel_deuda_vencida->size() + 1;
        tiene_deudas = true;
    }

    //    if (select_deuda_cte->size() > 0)
    //        total_row = total_row + select_deuda_cte->size() + (3 * select_deuda_cte->size());

    if (select_proximo->size() > 0)
        total_row = total_row + select_proximo->size() + (3 * select_proximo->size());

    total_row = total_row + 2;

    //    while (select_deuda_cte->next()) {
    //        if (select_deuda_cte->value(2).toDouble() < 0)
    //            total_row = total_row - 2;
    //    }

    while (select_proximo->next()) {
        if (select_proximo->value(2).toDouble() < 0)
            total_row = total_row - 2;
    }

    //    if (! select_deuda_cte->exec(str_cte)) {
    //        QMessageBox::critical(this,"Información","No se pueden obtener los datos. Intente nuevamente");
    //        return;
    //    }

    if (! select_proximo->exec(str_prox)) {
        QMessageBox::critical(this,"Información","No se pueden obtener los datos. Intente nuevamente");
        return;
    }

    // Se define la tabla de los detalles del cupón
    QTextTableFormat table_format;
    table_format.setHeaderRowCount(1);
    table_format.setBorderStyle(QTextFrameFormat::BorderStyle_Groove);
    table_format.setCellSpacing(0);
    table_format.setCellPadding(3);
    table_format.setWidth(QTextLength(QTextLength::PercentageLength, 100));
    cursor.movePosition(QTextCursor::StartOfBlock);

    cursor.insertTable(total_row,4,table_format);

    QTextCharFormat text_header_table;
    QFont textheaderfont;
    textheaderfont.setFamily("Helvetica57");
    textheaderfont.setBold(true);
    text_header_table.setFont(textheaderfont);
    QPen p;
    p.setColor(QColor(0,159,52));
    text_header_table.setTextOutline(p);
    text_header_table.setTableCellRowSpan(5);

    cursor.insertText("Concepto",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Descripcion",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Fecha",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Monto",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);

    double total_deuda = 0;
    double total_venc = 0;

    if (tiene_deudas) {
        text_format.setFont(textBoldFont);
        while (sel_deuda_vencida->next()) {
            // CONCEPTO
            cursor.insertText(sel_deuda_vencida->value(0).toString(),text_format);
            cursor.movePosition(QTextCursor::NextCell);
            // DESCRIPCION
            cursor.insertText(sel_deuda_vencida->value(4).toString(),text_format);
            cursor.movePosition(QTextCursor::NextCell);

            QDate fecha_atrasada = sel_deuda_vencida->value(1).toDate();
            QString mes_deuda = "Mes vencido: ";
            switch (fecha_atrasada.month()) {
            case 1:
                mes_deuda.append("Enero");
                break;
            case 2:
                mes_deuda.append("Febrero");
                break;
            case 3:
                mes_deuda.append("Marzo");
                break;
            case 4:
                mes_deuda.append("Abril");
                break;
            case 5:
                mes_deuda.append("Mayo");
                break;
            case 6:
                mes_deuda.append("Junio");
                break;
            case 7:
                mes_deuda.append("Julio");
                break;
            case 8:
                mes_deuda.append("Agosto");
                break;
            case 9:
                mes_deuda.append("Septiembre");
                break;
            case 10:
                mes_deuda.append("Octubre");
                break;
            case 11:
                mes_deuda.append("Noviembre");
                break;
            case 12:
                mes_deuda.append("Diciembre");
                break;
            }

            mes_deuda.append(" de ").append(QString::number(fecha_atrasada.year()));

            cursor.insertText(mes_deuda,text_format);
            cursor.movePosition(QTextCursor::NextCell);

            total_deuda = sel_deuda_vencida->value(2).toDouble();
            double porc_venc = 0;

//            if (sel_deuda_vencida->value(3).toString() == "Esporádico")
//                porc_venc = total_deuda * 0.1;
//            else
            porc_venc = total_deuda * 0.2;

            total_deuda = total_deuda + porc_venc;

            total_venc = total_venc + total_deuda;

            QString str_monto = "$ ";
            str_monto.append(QString("%1").arg(total_deuda, 0, 'f', 2));
            cursor.insertText(str_monto,text_format);
            cursor.movePosition(QTextCursor::NextCell);
        }
        cursor.movePosition(QTextCursor::NextRow);
    }

    double total_mesCte = 0;

    QTextCharFormat text_bold_format;
    QFont textbfont;
    textbfont.setFamily("Helvetica57-Condensed");
    textbfont.setBold(true);
    text_bold_format.setFont(textbfont);
    text_format.setFont(textfont);

    if (date.currentDate().day() < 25) {
        while (select_proximo->next()) {

            if (select_proximo->value(3).toString() != "Pago" || select_proximo->value(3).toString() != "No informado") {
                // CONCEPTO
                cursor.insertText(select_proximo->value(0).toString(),text_bold_format);
                cursor.movePosition(QTextCursor::NextCell);
                // DESCRIPCION
                cursor.insertText(select_proximo->value(5).toString(),text_bold_format);

                if (select_proximo->value(2).toDouble() < 0) {
                    cursor.movePosition(QTextCursor::NextCell);
                    QString str_fecha = "Mes ";
                    str_fecha.append(QString::number(QDate::currentDate().month())).append("/");
                    str_fecha.append(QString::number(QDate::currentDate().year()));
                    cursor.insertText(str_fecha,text_bold_format);

                    cursor.movePosition(QTextCursor::NextCell);
                    double monto_mes = select_proximo->value(2).toDouble();
                    QString str_monto = "$ ";
                    total_mesCte = total_mesCte + monto_mes;
                    str_monto.append(QString("%1").arg(monto_mes, 0, 'f', 2));
                    cursor.insertText(str_monto,text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                } else {
                    cursor.movePosition(QTextCursor::NextCell);
                    QString str_fecha = "01/";
                    str_fecha.append(QString::number(QDate::currentDate().month())).append(" al 10/");
                    str_fecha.append(QString::number(QDate::currentDate().month()));
                    cursor.insertText(str_fecha,text_bold_format);

                    cursor.movePosition(QTextCursor::NextCell);
                    double monto_mes = select_proximo->value(2).toDouble();
                    QString str_monto = "$ ";
                    total_mesCte = total_mesCte + monto_mes;
                    str_monto.append(QString("%1").arg(monto_mes, 0, 'f', 2));
                    cursor.insertText(str_monto,text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);

                    /**
                    * PRIMER VENCIMIENTOOOOO!!!!!!
                    */
                    // CONCEPTO
                    QString pric_venc = "1er vencimiento - ";
                    pric_venc.append(select_proximo->value(0).toString());
                    cursor.insertText(pric_venc,text_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // DESCRIPCION
                    cursor.insertText(select_proximo->value(5).toString(),text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // FECHA
                    QString str_1er_venc = "11/";
                    str_1er_venc.append(QString::number(QDate::currentDate().month())).append(" al 20/");
                    str_1er_venc.append(QString::number(QDate::currentDate().month()));
                    cursor.insertText(str_1er_venc,text_format);

                    QString tservicio = select_proximo->value(4).toString();

                    if (tservicio == "Esporádico") {
                        cursor.movePosition(QTextCursor::NextCell);
                        double cinco_x_ciento = monto_mes * 0.10;
                        QString monto_primer_vec = "$ ";
                        monto_primer_vec.append(QString("%1").arg(monto_mes + cinco_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_primer_vec,text_format);
                    }
                    else {
                        cursor.movePosition(QTextCursor::NextCell);
                        double diez_x_ciento = monto_mes * 0.10;
                        QString monto_sdo_vec = "$ ";
                        monto_sdo_vec.append(QString("%1").arg(monto_mes + diez_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_sdo_vec,text_format);
                    }

                    /**
                    * SEGUNDO VENCIMIENTOOOOO!!!!!!
                    */
                    // CONCEPTO
                    cursor.movePosition(QTextCursor::NextCell);
                    QString seg_venc = "2do vencimiento - ";
                    seg_venc.append(select_proximo->value(0).toString());
                    cursor.insertText(seg_venc,text_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // DESCRIPCION
                    cursor.insertText(select_proximo->value(5).toString(),text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // FECHA
                    QString str_2do_venc = "21/";
                    str_2do_venc.append(QString::number(QDate::currentDate().month())).append(" al ");
                    str_2do_venc.append(QString::number(UltimoDiaMes(QDate::currentDate().month()))).append("/");
                    str_2do_venc.append(QString::number(QDate::currentDate().month()));
                    cursor.insertText(str_2do_venc,text_format);

                    if (tservicio == "Esporádico") {
                        cursor.movePosition(QTextCursor::NextCell);
                        double cinco_x_ciento = monto_mes * 0.20;
                        QString monto_primer_vec = "$ ";
                        monto_primer_vec.append(QString("%1").arg(monto_mes + cinco_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_primer_vec,text_format);

                    }
                    else {
                        cursor.movePosition(QTextCursor::NextCell);
                        double diez_x_ciento = monto_mes * 0.20;
                        QString monto_sdo_vec = "$ ";
                        monto_sdo_vec.append(QString("%1").arg(monto_mes + diez_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_sdo_vec,text_format);
                    }
                }

                cursor.movePosition(QTextCursor::NextCell);
                cursor.movePosition(QTextCursor::NextRow);
            }
            else
                return;
        }
    } else {
        while (select_proximo->next()) {

            if (select_proximo->value(3).toString() != "Pago" || select_proximo->value(3).toString() != "No informado") {

                int mes = QDate::currentDate().month();
                if (QDate::currentDate().month() == 12) {
                    mes = 1;
                } else {
                    mes = mes + 1;
                }

                cursor.insertText(select_proximo->value(0).toString(),text_bold_format);
                cursor.movePosition(QTextCursor::NextCell);
                // DESCRIPCION
                cursor.insertText(select_proximo->value(5).toString(),text_bold_format);
                // FECHA
                if (select_proximo->value(2).toDouble() < 0) {
                    cursor.movePosition(QTextCursor::NextCell);
                    QString str_fecha = "Mes ";
                    str_fecha.append(QString::number(mes)).append("/");
                    str_fecha.append(QString::number(QDate::currentDate().year()));
                    cursor.insertText(str_fecha,text_bold_format);

                    cursor.movePosition(QTextCursor::NextCell);
                    double monto_mes = select_proximo->value(2).toDouble();
                    QString str_monto = "$ ";
                    total_mesCte = total_mesCte + monto_mes;
                    str_monto.append(QString("%1").arg(monto_mes, 0, 'f', 2));
                    cursor.insertText(str_monto,text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                } else {
                    cursor.movePosition(QTextCursor::NextCell);
                    QString str_fecha = "01/";
                    str_fecha.append(QString::number(mes)).append(" al 10/");
                    str_fecha.append(QString::number(mes));
                    cursor.insertText(str_fecha,text_bold_format);

                    cursor.movePosition(QTextCursor::NextCell);
                    double monto_mes = select_proximo->value(2).toDouble();
                    QString str_monto = "$ ";
                    total_mesCte = total_mesCte + monto_mes;
                    str_monto.append(QString("%1").arg(monto_mes, 0, 'f', 2));
                    cursor.insertText(str_monto,text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);

                    /**
                    * PRIMER VENCIMIENTOOOOO!!!!!!
                    */
                    QString pric_venc = "1er vencimiento - ";
                    pric_venc.append(select_proximo->value(0).toString());
                    cursor.insertText(pric_venc,text_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // DESCRIPCION
                    cursor.insertText(select_proximo->value(5).toString(),text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // FECHA
                    QString str_1er_venc = "11/";
                    str_1er_venc.append(QString::number(mes)).append(" al 20/");
                    str_1er_venc.append(QString::number(mes));
                    cursor.insertText(str_1er_venc,text_format);

                    QString tservicio = select_proximo->value(4).toString();

                    if (tservicio == "Esporádico") {
                        cursor.movePosition(QTextCursor::NextCell);
                        double cinco_x_ciento = monto_mes * 0.10;
                        QString monto_primer_vec = "$ ";
                        monto_primer_vec.append(QString("%1").arg(monto_mes + cinco_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_primer_vec,text_format);
                    }
                    else {
                        cursor.movePosition(QTextCursor::NextCell);
                        double diez_x_ciento = monto_mes * 0.10;
                        QString monto_sdo_vec = "$ ";
                        monto_sdo_vec.append(QString("%1").arg(monto_mes + diez_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_sdo_vec,text_format);
                    }

                    /**
                    * SEGUNDO VENCIMIENTOOOOO!!!!!!
                    */
                    cursor.movePosition(QTextCursor::NextCell);
                    QString seg_venc = "2do vencimiento - ";
                    seg_venc.append(select_proximo->value(0).toString());
                    cursor.insertText(seg_venc,text_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // DESCRIPCION
                    cursor.insertText(select_proximo->value(5).toString(),text_bold_format);
                    cursor.movePosition(QTextCursor::NextCell);
                    // FECHA
                    QString str_2do_venc = "21/";
                    str_2do_venc.append(QString::number(mes)).append(" al ");
                    str_2do_venc.append(QString::number(UltimoDiaMes(mes))).append("/");
                    str_2do_venc.append(QString::number(mes));
                    cursor.insertText(str_2do_venc,text_format);

                    if (tservicio == "Esporádico") {
                        cursor.movePosition(QTextCursor::NextCell);
                        double cinco_x_ciento = monto_mes * 0.20;
                        QString monto_primer_vec = "$ ";
                        monto_primer_vec.append(QString("%1").arg(monto_mes + cinco_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_primer_vec,text_format);
                    }
                    else {
                        cursor.movePosition(QTextCursor::NextCell);
                        double diez_x_ciento = monto_mes * 0.20;
                        QString monto_sdo_vec = "$ ";
                        monto_sdo_vec.append(QString("%1").arg(monto_mes + diez_x_ciento, 0, 'f', 2));
                        cursor.insertText(monto_sdo_vec,text_format);
                    }
                }

                cursor.movePosition(QTextCursor::NextCell);
                cursor.movePosition(QTextCursor::NextRow);
            }
            else
                return;
        }
    }

    cursor.insertText("Total a pagar (sin vencimiento)",text_bold_format);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("                               ",text_bold_format);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("                               ",text_bold_format);
    cursor.movePosition(QTextCursor::NextCell);
    double total_a_pagar = total_venc + total_mesCte;
    QString total_pagar = "$ ";
    total_pagar.append(QString("%1").arg(total_a_pagar, 0, 'f', 2));
    cursor.insertText(total_pagar,text_bold_format);
    cursor.movePosition(QTextCursor::End);

    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();
    cursor.insertBlock();

    cursor.insertText("\t \t \t \t \t \t                Saludamos atentamente.",text_format);
    cursor.insertBlock();
    cursor.insertText("\t \t \t \t \t \t \t    Enjoy Life",header_format);
    cursor.insertBlock();

    QTextCharFormat text_under_format;
    QFont textunfont;
    textunfont.setFamily("Helvetica57-Condensed");
    //    textunfont.setUnderline(true);
    text_under_format.setFont(textunfont);
    text_under_format.setForeground(QBrush(Qt::blue));

    cursor.insertText("\t \t \t \t \t     ");
    cursor.insertText("www.enjoylife.com.ar",text_under_format);

    cursor.insertText("  |  contacto@enjoylife.com.ar", text_format);

    document->print(print);

    //    QMessageBox::StandardButton reply;
    //    reply = QMessageBox::question(this, "Creación Exitosa", "El cupón se ha creado exitosamente. Quiere enviarlo por mail ahora?",
    //                                  QMessageBox::Yes|QMessageBox::No);

    //    //    “to=asd@asd,subject=Prova,body=bodybodybody,attachment=‘file:///C:/logfile.log’”
    //    //mailto:user@foo.com?subject=Test&body=Just a test
    //    if (reply == QMessageBox::Yes) {
    //        QString mail_to = "mailto=pereyraf88@gmail.com?subject=Prueba";
    //        //        mail_to.append(",attachment='").append(final_path).append("'");
    //        if (! QDesktopServices::openUrl(QUrl(mail_to))) {
    //            QMessageBox::information(this,"Información", "No se puede abrir el cupón. Intente nuevamente");
    //        }
    //    }
}

void CobroMensualModule::GenerarListadoPDF(QString path)
{
//    QString formatoFecha = "dd-MM-yyyy";
    QSqlQuery *queryVistaCM = new QSqlQuery(enjoylifedb);
    QString strVistaCm;
    strVistaCm.append("CREATE OR REPLACE VIEW vista_cobromensual_listado AS "
                      "SELECT cc.cc_razon_social, "
                         "cc.concepto, "
                         "cc.debe, "
                         "cc.desde, "
                         "cc.estado_deuda, "
                         "cc.tipo_cobro, "
                         "cc.descripcion, "
                         "c.razon_social, "
                         "c.estado "
                      "FROM cuenta_corriente cc, cliente c "
                      "WHERE cc.cc_razon_social <> '' AND (cc.estado_deuda = 'Debe' OR cc.estado_deuda = 'No informado') "
                      "AND (cc.cc_razon_social = c.razon_social) AND (c.estado is null OR c.estado != 'BAJA') "
                      "ORDER BY cc.cc_razon_social, cc.desde;");

    enjoylifedb.transaction();
    if (! queryVistaCM->exec(strVistaCm)) {
        QMessageBox::critical(this,"Error","Error al crear la vista de Cobro Mensual, intente nuevamente");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.transaction();

    bool proxAnio = false;
    QString current_date;
    QString report_name = "Listado_Cobros_";
    if (QDate::currentDate().day() >= 25) {
        if (QDate::currentDate().month() < 12) {
            current_date.append(QString::number(QDate::currentDate().year())).append("-");
            current_date.append(QString::number(QDate::currentDate().month()+1)).append("-");
            current_date.append(QString::number(1));
            switch (QDate::currentDate().month()+1) {
            case 1:
                report_name.append("Enero");
                break;
            case 2:
                report_name.append("Febrero");
                break;
            case 3:
                report_name.append("Marzo");
                break;
            case 4:
                report_name.append("Abril");
                break;
            case 5:
                report_name.append("Mayo");
                break;
            case 6:
                report_name.append("Junio");
                break;
            case 7:
                report_name.append("Julio");
                break;
            case 8:
                report_name.append("Agosto");
                break;
            case 9:
                report_name.append("Septiembre");
                break;
            case 10:
                report_name.append("Octubre");
                break;
            case 11:
                report_name.append("Noviembre");
                break;
            case 12:
                report_name.append("Diciembre");
                break;
            }
        }
        else {
            current_date.append(QString::number(QDate::currentDate().year()+1)).append("-");
            current_date.append(QString::number(1)).append("-");
            current_date.append(QString::number(1));
            report_name.append("Enero");
            proxAnio = true;
        }
    }
    else {
        current_date.append(QString::number(QDate::currentDate().year())).append("-");
        current_date.append(QString::number(QDate::currentDate().month())).append("-");
        current_date.append(QString::number(1));
        switch (QDate::currentDate().month()) {
        case 1:
            report_name.append("Enero");
            break;
        case 2:
            report_name.append("Febrero");
            break;
        case 3:
            report_name.append("Marzo");
            break;
        case 4:
            report_name.append("Abril");
            break;
        case 5:
            report_name.append("Mayo");
            break;
        case 6:
            report_name.append("Junio");
            break;
        case 7:
            report_name.append("Julio");
            break;
        case 8:
            report_name.append("Agosto");
            break;
        case 9:
            report_name.append("Septiembre");
            break;
        case 10:
            report_name.append("Octubre");
            break;
        case 11:
            report_name.append("Noviembre");
            break;
        case 12:
            report_name.append("Diciembre");
            break;
        }
    }

    if (proxAnio) {
        report_name.append("_").append(QString::number(QDate::currentDate().year()+1)).append(".pdf");
    } else {
        report_name.append("_").append(QString::number(QDate::currentDate().year())).append(".pdf");
    }

    QPrinter* print = new QPrinter(QPrinter::HighResolution);
    print->setOutputFormat(QPrinter::PdfFormat);
    print->setColorMode(QPrinter::Color);
    QString final_path;
    final_path.append(path).append("/").append(report_name);
    print->setOutputFileName(final_path);

    QTextDocument *document = new QTextDocument;

    QTextCursor cursor(document);
    cursor.movePosition(QTextCursor::Start);

    // Se define la tabla de los detalles del cupón
    QTextTableFormat table_format;
    table_format.setHeaderRowCount(1);
    table_format.setBorderStyle(QTextFrameFormat::BorderStyle_Groove);
    table_format.setCellSpacing(0);
    table_format.setCellPadding(3);
    table_format.setWidth(QTextLength(QTextLength::PercentageLength, 100));
    cursor.movePosition(QTextCursor::StartOfBlock);

    //    cursor.movePosition(QTextCursor::NextCell);

    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString str_sel = "select razon_social from cliente where estado is null order by razon_social";

    if (! query->exec(str_sel)) {
        QMessageBox::critical(this,"Información","No se pueden obtener los datos de los clientes registrados. Intente nuevamente");
        return;
    }

    cursor.insertTable(query->size() + 3,6,table_format);

    QTextCharFormat text_header_table;
    QFont textheaderfont;
    textheaderfont.setFamily("Helvetica57");
    textheaderfont.setBold(true);
    text_header_table.setFont(textheaderfont);
    QPen p;
    p.setColor(QColor(0,159,52));
    text_header_table.setTextOutline(p);
    text_header_table.setTableCellRowSpan(5);

    cursor.insertText("Cliente",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Esporádico",text_header_table); // Esporádico
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Deuda",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Servicio",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Total",text_header_table);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.insertText("Pagó",text_header_table);

    cursor.movePosition(QTextCursor::NextCell);

    QTextCharFormat text_format;
    QFont textfont;
    textfont.setFamily("Helvetica57-Condensed");
    QFont textBoldFont;
    textBoldFont.setFamily("Helvetica57-Condensed");
    textBoldFont.setBold(true);
    text_format.setFont(textfont);


    //    current_date.append(QString::number(QDate::currentDate().year())).append("-");
    //    current_date.append(QString::number(QDate::currentDate().month())).append("-");
    //    current_date.append(QString::number(1));

    double total_cobro = 0.0;

    while (query->next()) {

        double total_x_cliente = 0.0;

        QString client = query->value(0).toString();

        cursor.insertText(client,text_format);

        cursor.movePosition(QTextCursor::NextCell);


        // MONTO DE DEUDA ESPORÁDICO
        QSqlQuery *sel_esporadico = new QSqlQuery(enjoylifedb);
        QString str_sel_esp = "select sum(debe) from vista_cobromensual_cupones where cc_razon_social = '";
        str_sel_esp.append(client).append("' and tipo_cobro = 'Esporádico' and desde = '");
        str_sel_esp.append(current_date).append("'");

        if (!sel_esporadico->exec(str_sel_esp)) {
            QMessageBox::critical(this,"Información","No se pueden obtener los datos de deuda. Intente nuevamente");
            return;
        }

        while (sel_esporadico->next()) {

            total_x_cliente = total_x_cliente + sel_esporadico->value(0).toDouble();
            QString m = "$ ";
            m.append(QString("%1").arg(sel_esporadico->value(0).toDouble(), 0, 'f', 2));
            cursor.insertText(m,text_format);

        }

        cursor.movePosition(QTextCursor::NextCell);

        // DEUDAS ANTERIORES
        QSqlQuery *sel_deudas = new QSqlQuery(enjoylifedb);
        QString str_sel_deuda = "select sum(debe) from vista_cobromensual_cupones where cc_razon_social = '";
        str_sel_deuda.append(client).append("' and desde < '").append(current_date).append("'");
        str_sel_deuda.append(" and estado_deuda = 'Debe'");

        if (!sel_deudas->exec(str_sel_deuda)) {
            QMessageBox::critical(this,"Información","No se pueden obtener los datos de deuda. Intente nuevamente");
            return;
        }

        while (sel_deudas->next()) {

            total_x_cliente = total_x_cliente + sel_deudas->value(0).toDouble();
            QString m = "$ ";
            m.append(QString("%1").arg(sel_deudas->value(0).toDouble(), 0, 'f', 2));
            cursor.insertText(m,text_format);

        }

        cursor.movePosition(QTextCursor::NextCell);

        // TOTAL DE SERVICIOS
        QSqlQuery *sel_serv = new QSqlQuery(enjoylifedb);
        QString str_sel_serv = "select sum(debe) from vista_cobromensual_cupones where cc_razon_social = '";
        str_sel_serv.append(client).append("' and tipo_cobro = 'Servicio' and desde = '");
        str_sel_serv.append(current_date).append("'");

        if (!sel_serv->exec(str_sel_serv)) {
            QMessageBox::critical(this,"Información","No se pueden obtener los datos de deuda. Intente nuevamente");
            return;
        }

        while (sel_serv->next()) {

            total_x_cliente = total_x_cliente + sel_serv->value(0).toDouble();
            QString m = "$ ";
            m.append(QString("%1").arg(sel_serv->value(0).toDouble(), 0, 'f', 2));

            cursor.insertText(m,text_format);
        }

        cursor.movePosition(QTextCursor::NextCell);

        // TOTAL X CLIENTE
        QString m = "$ ";
        m.append(QString("%1").arg(total_x_cliente, 0, 'f', 2));
        cursor.insertText(m,text_format);

        total_cobro = total_cobro + total_x_cliente;

        cursor.movePosition(QTextCursor::NextCell);

        //PAGO
        cursor.movePosition(QTextCursor::NextCell);
    }

    QTextCharFormat text_bold_format;
    QFont textbfont;
    textbfont.setFamily("Helvetica57-Condensed");
    textbfont.setBold(true);
    text_bold_format.setFont(textbfont);

    cursor.movePosition(QTextCursor::NextRow);
    cursor.movePosition(QTextCursor::NextRow);

    cursor.insertText("Total",text_bold_format);

    cursor.movePosition(QTextCursor::NextCell);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.movePosition(QTextCursor::NextCell);
    cursor.movePosition(QTextCursor::NextCell);

    QString m = "$ ";
    m.append(QString("%1").arg(total_cobro, 0, 'f', 2));
    cursor.insertText(m,text_bold_format);

    cursor.movePosition(QTextCursor::End);

    document->print(print);
}

int CobroMensualModule::UltimoDiaMes(int month)
{
    if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
        return 31;
    else if (month == 2) {
        return 28;
    }
    else
        return 30;
}
